package com.hsxxherp.simplify.framework.utils;

import java.util.Random;
import java.util.UUID;

/**
 * String 工具类
 *
 * @author Mark·虎克 (2486970363@qq.com)
 */
public class StringUtil {
    /**
     * 判断字符串是否为空或 null。
     * 如果字符串为 null 或者长度为 0，则认为该字符串为空。
     *
     * @param str 要检查的字符串
     * @return 如果字符串为空或 null，返回 true；否则返回 false
     */
    public static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }

    /**
     * 判断字符串是否不为空或 null。
     * 与 isEmpty 方法相反，如果字符串不为 null 且长度大于 0，则认为该字符串不为空。
     *
     * @param str 要检查的字符串
     * @return 如果字符串不为空或 null，返回 true；否则返回 false
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    /**
     * 去除字符串两端的空白字符。
     * 如果输入字符串为 null，则返回 null。
     *
     * @param str 要处理的字符串
     * @return 去除两端空白字符后的字符串，如果输入为 null，则返回 null
     */
    public static String trim(String str) {
        return str == null ? null : str.trim();
    }

    /**
     * 将字符串转换为大写形式。
     * 如果输入字符串为 null，则返回 null。
     *
     * @param str 要转换的字符串
     * @return 转换为大写后的字符串，如果输入为 null，则返回 null
     */
    public static String toUpperCase(String str) {
        return str == null ? null : str.toUpperCase();
    }

    /**
     * 将字符串转换为小写形式。
     * 如果输入字符串为 null，则返回 null。
     *
     * @param str 要转换的字符串
     * @return 转换为小写后的字符串，如果输入为 null，则返回 null
     */
    public static String toLowerCase(String str) {
        return str == null ? null : str.toLowerCase();
    }

    /**
     * 检查字符串是否包含指定的子字符串。
     * 如果输入的源字符串或子字符串为 null，则返回 false。
     *
     * @param source 源字符串
     * @param subStr 要检查的子字符串
     * @return 如果源字符串包含子字符串，返回 true；否则返回 false
     */
    public static boolean contains(String source, String subStr) {
        return source != null && subStr != null && source.contains(subStr);
    }

    /**
     * 比较两个字符串是否相等，忽略大小写。
     * 如果两个字符串都为 null，则认为它们相等；如果其中一个为 null，另一个不为 null，则认为不相等。
     *
     * @param str1 第一个要比较的字符串
     * @param str2 第二个要比较的字符串
     * @return 如果两个字符串相等（忽略大小写），返回 true；否则返回 false
     */
    public static boolean equalsIgnoreCase(String str1, String str2) {
        if (str1 == null) {
            return str2 == null;
        }
        return str1.equalsIgnoreCase(str2);
    }

    /**
     * 比较两个字符串是否相等，区分大小写。
     * 如果两个字符串都为 null，则认为它们相等；如果其中一个为 null，另一个不为 null，则认为不相等。
     *
     * @param str1 第一个要比较的字符串
     * @param str2 第二个要比较的字符串
     * @return 如果两个字符串相等（区分大小写），返回 true；否则返回 false
     */
    public static boolean equals(String str1, String str2) {
        if (str1 == null) {
            return str2 == null;
        }
        return str1.equals(str2);
    }

    /**
     * 生成指定长度的随机字符串，包含字母和数字。
     *
     * @param length 要生成的随机字符串的长度
     * @return 生成的随机字符串
     */
    public static String generateRandomString(int length) {
        final String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(characters.length());
            sb.append(characters.charAt(index));
        }
        return sb.toString();
    }

    /**
     * 生成一个基于 UUID 的随机字符串。
     *
     * @return 生成的 UUID 随机字符串，去除了连字符
     */
    public static String generateUuid() {
        return UUID.randomUUID().toString().replace("-", "");
    }
}
